/*
* Функция, которая загружается по окончанию формирования DOM
*
* @return void
 **/
function onloadJS(){}

/**
 * объект фильтра
 */


storage = {   
    
    /*
     *объект, содержащий инициализационные данные карты
     **/
    map : {
        centerLat : null, //широта центра карты
        centerLng : null, //долгота центра карты
        zoom : 10, //масштаб карты
        markersOut : [], // массив маркеров, которые есть на карте в данный момент
        width : 600, //ширина карты
        height : 300 //высота карты
    },

    /*
     *объект, содержащий данные для поиска
     **/
    search : {
            aim : null, //цель поиска (1 - здания, 2 - фирмы, 3 - офисы , 4 - объявления)
            typeBuild : null, //тип здания
            searchWord : '', //часть слова для фильстрации
            freeOffice: false, //искать со свободными офисами
            freeVacancy: false, //искать со свободными вакансиями
            ageFrom : 0, //искать в возраст от
            ageUnder : 100, //искать в ввозрасте до
            salaryFrom : 0, //искать с заработной плато от
            experienceFrom : 0, // искать с опытом работы от
            specialization : {},//объект содержащий выбарнные специалиазации фирмы
            showSpecForm : false, //показывает, была ли открыта формы со специалиазациями
            arrPodRazdel : {}, //объект содержащий выбарнные специалиазации фирмы
            page : 1, //страница показа
            specialization_ins : {} //объект, ...
    },

    /*
     *объект, содержащий наши гео-данные
     **/
    ourGeo : {
            address : '', //наш адрес
            ourCity : '', //наш город
            ourCountry :  '' //наша страна
    } 
} // end of object storage

var markersOn = []; //массив, хранящий маркеры карты
var centerChanged = true; // показывает, был изменен центр карты врунчую
var zoomChanged = false; // показывает, был изменен масштаб карты врунчую
var arrPodRazdel = {};
var divElement;

var _map = {}; //объект для манипуляции _MAP
_map.markerEssence;//маркер сущности
_map.arrPodRazdel = {}; // объект, хранящий выбранные подразделы специализаций

_map.option = {
    essence : null,
    idEssnece :  null,
    element : null
}


/*
 *объекь, содержащий результаты выполнения для использования из вне
 **/
_map.out = {
    essence : null, //поле, показывающее выбранную сущность
    idEssence : null //поле, показывающее выбраннй адишник сущности
}

/*
 * инициализация плагина
 *
 * @param string element 
 *      элемент, на котороом инициализируется плагин
 * @param object option
 *      данные для инициализации
 *      {
 *      string essence('firm'||'build'||'insert'||'office') 
 *          сущность, которая будет отображаться на карте в поиске,
 *      integer idEssence
 *          айдишник элемента выбранной сущности
 *      }
 *          
 * @return void
 **/
_map.initialize = function() {

    var dataSend = {
        query : 'initial',
        option : _map.option
    }
    
    
    $.post(
        W_AJAX + "controllers/controller_map.php",
        {
            dataSend : dataSend
        },
        function(answer){
            if (!answer.error) {
                /* если нет ошибки, то объект answer содержит следующие поля:
                * float lat
                * float lng
                * integer idFirm - айдишник элемента сущности. НЕДОРАБОТКА!!!
                * string name - имя сущности,
                * string description - описание сущности,
                * string cityName - город, где расопложен элемент сущности,
                * text HTMLessence - html-код, корый будет вставлен в баллун над маркером
                * bool error - была ли ошибка на стороне сервера
                * text messageInitial - html-код, корый будет вставлени в модальное окно при его инициализации
                */
                
                
                /*
                 *очистка стилей у элемента
                 **/
                if ($('#' +_map.option.element).length > 0) 
                     $('#' + _map.option.element).remove();
                 
                $('body').append('<div id="' + _map.option.element + '">werwe</div>');

                var divElement = document.getElementById('dialog');
                
                //записываем полученные от сервера данные в инициализируемый элемент
               
                divElement.innerHTML = '';
                divElement.innerHTML = answer.messageInitial;
                //divElement.getElementById(_map.option.element).innerHTML = answer.messageInitial;

                //получаем данные для инициализации карты
                var lat = answer.lat;
                var lng = answer.lng;
                var zoom = 12;
                var latLng = new google.maps.LatLng(lat, lng);

                //записываем в объект фильтра цель поиска
                storage.search.aim = answer.aim;

                //записываем в объект фильтра город
                storage.ourGeo.ourCity = answer.cityName;

                //инициализация карты с получеными параметрами
                var myOptions = {
                    center: latLng,
                    zoom: zoom,
                    mapTypeId: google.maps.MapTypeId.ROADMAP
                };

                var elems = divElement.getElementsByTagName('*')

                for(var i=0; i<elems.length; i++) { 
                    if (elems[i].id == 'map_canvas')
                       var map_canvas = elems[i];
                }

                map = new google.maps.Map(map_canvas, myOptions);

                /*
                *добавляем маркер сущнсоти
                **/ 
                var marker = new google.maps.Marker({ //добавляем новый маркер с координатами щелчка
                    position: latLng, 
                    map : map,
                    icon: W_IMAGES + 'woman_mark.png'
                }); 

                //добавляем изначальный элемент-маркер в массив для дальнейшего управления им
                _map.markerEssence = marker;

                //если баллун был раньше инициализирован, то закрываем предыдущее инфоокно
                if ( typeof infoWindow != 'undefined')
                    infoWindow.close();

                //добавляем новое инфоокно на карту(местоположение указанного при инициализации элемента сущности)
                infoWindow = new google.maps.InfoWindow({ 
                    position: latLng, 
                    content: answer.HTMLessence, //содержание окошка, полученно от сервера в ответе
                    map: map
                });
                
                setTimeout('infoWindow.close();', 10000)

                //добаллям обработчик на маркер. 
                google.maps.event.addListener(marker, 'mouseover', function(event){           

                    //если есть еще балун, то закрываем его
                    if ( typeof infoWindow != 'undefined')
                        infoWindow.close();

                            //добавляем новый балун
                            infoWindow = new google.maps.InfoWindow({ 
                                position: latLng, 
                                content: answer.HTMLessence,
                                map: map
                            });
                            
                            setTimeout('infoWindow.close();', 5000)
                    })

                //а теперь показываем получившееся модальное окно
                _map.showModWindow();  
            } else {
                //выводим сообщение об ошибке, если на сервере возникла какая-то ошибка во время инициализации
                alert(answer.error);
            } 
        },
        'json'
    ); 
}// end of _map.initialize


/*
 * показываем модальное окно
 *
 * @return void
 **/
_map.showModWindow = function () {
    $( "#dialog:ui-dialog" ).dialog( "destroy" );
    $( "#dialog" ).dialog({
        height: 470, //высота мод. окна
        width: 680, //ширина мод. окна
        modal: true
    });     
    //$(".ui-dialog-titlebar").hide();    //здесь можно убрать шапку сайта
}

_map.updateMap = function() {
           
        if (typeof markerCluster != 'undefined') {
           markerCluster.clearMarkers();
           
           delete markerCluster;
           
           markersOn.length = 0;
        }
        
        var lat = storage.map.centerLat;
        var lng = storage.map.centerLng;
        var zoom = parseInt(storage.map.zoom);
        
        var latLng = new google.maps.LatLng(lat, lng);
        
        zoomChanged = false;
        map.setCenter(latLng);
        zoomChanged = true;
        
        zoomChanged = false;
        map.setZoom(zoom);
         zoomChanged = true;
    
 
        /*
        *в процессе генерации страницы php скриптом, в ней интегрируется массив с координатами Зданий, которые необходимо отобразить на странице. Массив с названием coord[lat_1: 343, lng_1: 34, lat_2:3434...];
        **/
       

        for (var key in storage.map.markersOut) {

            var z = storage.map.markersOut[key];

            var lat = z['lat'];
            var lng = z['lng'];
            var name = z['name'];
            var description = z['description'];
            var id = z['id'];
            var essence = z['essence'];

            var latLng = new google.maps.LatLng(lat, lng);
            
            var marker = new google.maps.Marker({ //добавляем новый маркер с координатами щелчка
                position: latLng,
                map : map,
                icon : W_IMAGES + 'user_mark.png'
            }); 

            
            markersOn.push(marker);
            
            /*применям замыкания для назначения каждому обработчику свой маркер*/

            (function(latLng, id, name, marker, windowArr){ 

                google.maps.event.addListener(marker, 'mouseover', function(event){           

                    if ( typeof infoWindow != 'undefined')
                        infoWindow.close();

                            infoWindow = new google.maps.InfoWindow({ 
                                position: latLng, 
                                content : '<table><tr><td rowspan="1" width="75px"><img src="' + W_IMAGES + 'firms_50/none.jpg"></td><td><span style="font-size: 15px; font-weight: bold">' + name + '</span><br><span style="font-size: 10px; font-weight: bold; color: grey;">' + description + '</span></td></tr><tr><td><a style="color: blue" href="#">смотреть фирму</a></td><td><a style="color: red; font-weight: bold" href="#" onClick="_map.chooseEss(\'' + _map.option.essence + '\', ' + id + ')">выбрать</a></td></tr></table>',
                                map: map
                            }); 
                    })
            })(latLng, id, name, marker);
            

            

        }
        
       markerCluster = new MarkerClusterer(map, markersOn);

}

/*
 *function _map.serverFiltrQuery
 *
 *
 **/
_map.serverFiltrQuery = function(){
        
    storage.map.zoom = map.getZoom();

    var center = map.getCenter();
    storage.map.centerLat = center.lat();
    storage.map.centerLng = center.lng();

    if (typeof _map.arrPodRazdel != 'undefined')
        storage.search.arrPodRazdel = _map.arrPodRazdel;
    else
        storage.search.arrPodRazdel = {};


    

    if ($('#searchWord').length > 0){
        
        var searchWord = _map.getElementInside('searchWord', 'dialog');
        storage.search.searchWord = searchWord.value;
        
    }
    else
        storage.search.searchWord = '';

    //if ($('#objSearch').length > 0)
    //    storage.search.aim = divElement.getElementById('objSearch').value;
    //else
    //    storage.search.aim = 1;


    if ($('#freeOffice').length > 0)
        storage.search.freeOffice = divElement.getElementById('freeOffice').checked;
    else
        storage.search.freeOffice = false;

    if ($('#freeVacancy').length > 0) {
        var freeVacancy = _map.getElementInside('freeVacancy', 'dialog');
        storage.search.freeVacancy = freeVacancy.checked;
    }
    else
        storage.search.freeVacancy = false;


    if ($('.podpodRazdel').length > 0) {
        
        var divElement = document.getElementById('dialog');
        //*********
                var elems = divElement.getElementsByTagName('*')

                for(var i=0; i<elems.length; i++) { 
                    if (elems[i].class == 'podpodRazdel')
                       var map_canvas = elems[i];
                }
        //*********
        
        
        
        var elements = divElement.getElementsByClassName('podpodRazdel');

        var specialization = [0];
        var i = 0;
        for(var key in elements){
            if (elements[key].checked){
                var x = elements[key].id;

                if (typeof x != 'undefined')
                    specialization[i] = x.substr(3,x.length);

                i++;
            }
        }

        storage.search.specialization = specialization;

    } else 
        storage.search.specialization = {};


    //****
    if ($('.podpodRazdel_ins').length > 0) {
        var elements= divElement.getElementsByClassName('podpodRazdel_ins');

        var specialization_ins = [0];
        var i = 0;
        for(var key in elements){
            if (elements[key].checked){
                var x = elements[key].id;

                if (typeof x != 'undefined')
                    specialization_ins[i] = x.substr(3,x.length);

                i++;
            }
        }
        storage.search.specialization_ins = specialization_ins;
    } else
        storage.search.specialization_ins = {};
    //*****


    if ($('#salaryRateFrom').length > 0)
        storage.search.salaryFrom = divElement.getElementById('salaryRateFrom').value;
    else
        storage.search.salaryFrom = 0;

    if ($('#experienceRateFrom').length > 0)
        storage.search.experienceFrom = divElement.getElementById('experienceRateFrom').value;
    else
        storage.search.experienceFrom = 0;

    if ($('#ageRateFrom').length > 0)
        storage.search.ageFrom = divElement.getElementById('ageRateFrom').value;
    else
        storage.search.ageFrom = 0;

    if ($('#ageRateUnder').length > 0)
        storage.search.ageUnder = divElement.getElementById('ageRateUnder').value;
    else
        storage.search.ageUnder = 100;

        if (typeof (showRazdel_var) != 'undefined') {
            if (showRazdel_var)
                storage.search.showSpecForm = true;
            else 
                storage.search.showSpecForm = false;
        } else
            storage.search.showSpecForm = false;




                var dataSend = {
                            query : 'getFiltr',
                            storage : storage

                }


                $.post(
                    W_AJAX + "controllers/controller_map.php",
                    {
                        dataSend : dataSend
                    },
                    function(serverAnswer){

                            storage = serverAnswer;

                            document.getElementById('filtr').innerHTML = ''; 
                            document.getElementById('filtr').innerHTML = storage.message;
                            eval(storage.script);
                            storage.message = '';

                            _map.updateMap();
                        },
                    'json'
                ); 
    
} 

/*
 *выбираем другой элемент
 **/
_map.changeFirm = function () {
    
   //добавляем обработкич на "перетаскивание карты"
   google.maps.event.addListener(map, 'dragend', function(event){  

        //провреем, было ли перетаскивание осуществлено вручную
        if (centerChanged)     
            _map.serverFiltrQuery(); //вызов основной функции фильтра
            

    })
    
    //добавляем обработкич на изменение масштаба
    google.maps.event.addListener(map, 'zoom_changed', function(event){  

        //провреем, было ли изменение мастаба осуществлено вручную
        if (zoomChanged) 
            _map.serverFiltrQuery();//вызов основной функции фильтра
    })
    
    _map.serverFiltrQuery();   
}


_map.showRazdel = function showRazdel() {
    

    if (typeof (showRazdel_var) != 'undefined') {
        if (showRazdel_var)
            showRazdel_var = false;
        else 
            showRazdel_var = true;
    } else
        showRazdel_var = true;

    var options = {};
    
    if (showRazdel_var)
        $("#razdel").show( "blind", options, 500, function(){}); 
    else
        $("#razdel").hide( "blind", options, 500, function(){}); 

}

_map.hidePodRazdel = function(numPodRazdel){
    
    var divElement = document.getElementById('dialog');
    var elems = divElement.getElementsByTagName('*')

    for(var i=0; i<elems.length; i++) { 

        var elem = "podRazdel_" + numPodRazdel;
        if (elems[i].id == elem)
            var toHide = elems[i];
    }
    
    
    
    $(toHide).hide( "blind", {}, 500, function(){}); 
    _map.arrPodRazdel[numPodRazdel] = false;
   // console.log(arrPodRazdel);
}

_map.showPodRazdel = function(numPodRazdel){
    if (typeof _map.arrPodRazdel[numPodRazdel] == 'undefined')
        _map.arrPodRazdel[numPodRazdel] = false;
    
        if (_map.arrPodRazdel[numPodRazdel])
            _map.hidePodRazdel(numPodRazdel);
        else{
            _map.arrPodRazdel[numPodRazdel] = true;
          
            var divElement = document.getElementById('dialog');
            var elems = divElement.getElementsByTagName('*')

            for(var i=0; i<elems.length; i++) { 

                var elem = "podRazdel_" + numPodRazdel;
                if (elems[i].id == elem)
                    var toShow = elems[i];
            }

            $(toShow).show( "blind", {}, 500, function(){}); 
        }
}

_map.selectAllSpec = function (){ 

    var elements = _map.getElementInside_class('podpodRazdel', 'dialog');

    for (var key in elements)
        elements[key].checked = 1;
    
    
    _map.serverFiltrQuery();
   
}

_map.changeCity = function() {
    
                /*
        *автоподгрузчик городов
        **/
        $("#cityCountry").autocomplete(W_AJAX + "city/getCity.php", {
            delay:10,
            minChars:1,
            matchSubset:1,
            autoFill:true,
            matchContains:1,
            cacheLength:10,
            selectFirst:true,
            maxItemsToShow:10
        });
    
    
    $('#changeCity').show();
    
}

_map.choosenCity = function () {
    
        var error = false;

            /*
            *получаем данные о городе, стране и адресе из введенных форм на страничке 
            */
           
           
            var cityCountry = _map.getElementInside ('cityCountry', 'dialog');
            var cityCountry = cityCountry.value; // формат :город(страна). Пр-р: "Москва(Россия)"

            /*
            *парсим город(страна) на отдельные составляющие : город и страна
            **/
            cityName = '';
            countryName = '';
            var myRe = /(^[ 0-9А-Яа-я_-]+)(\(([ 0-9А-Яа-я_-]+)\))?/g;//регулярка для вытаскивания имен города и страны
            if ((myArray = myRe.exec(cityCountry)) != null) {
                cityName = myArray[1];
                cityName = TrimStr(cityName);
                countryName = myArray[3];
                countryName = TrimStr(countryName);
            }

            /*
            *в случае, если пользователем было некорректно введено значение в поле "город", то выводим соответсвующую ошибку и дальше не продолжаем выполнение скрипта
            **/
            if((cityName == "") || (countryName == "")){
                alert("Вы некорректно ввели ");
            } else {            
               storage.ourGeo.ourCity = cityName;
               storage.ourGeo.ourCountry = countryName;            
               $('#changeCity').hide();
               
               /*
                *получаем координаты города
                **/
               var dataSend = {
                        query : 'getCoordCity',
                        city : storage.ourGeo.ourCity,
                        country : storage.ourGeo.ourCountry
                    }    
                    
            $.post(
                W_AJAX + "controllers/controller_map.php",
                {
                    dataSend : dataSend
                },
                function(answer){
                    
                        if (!answer.error) {
                            storage.map.centerLat = answer.lat;
                            storage.map.centerLng = answer.lng;
                            
                            var latLng = new google.maps.LatLng(answer.lat, answer.lng);
                            
                            zoomChanged = false;
                            map.setCenter(latLng);
                            zoomChanged = true;

                            _map.changeFirm();
                            //_map.serverFiltrQuery();
                            
                            
                        } else {
                            alert('Такого города нет в БД');
                        }
                    
                    },
                'json'
            ); 
       
    }
}


/*
 * 
 *
 * @param 
 * 
 * @param idEssence
 * 
 * @retun void
 **/
_map.chooseEss = function (essence, idEssence) {
    
   _map.out.essence = essence;
    _map.out.idEssence = idEssence;
    
    $('#dialog').dialog("destroy");
    
    _map.handler();
}

_map.clearAllSpec  = function () {

    var elements = _map.getElementInside_class('podpodRazdel', 'dialog');
        
    for (var key in elements)
        elements[key].checked = 0;
    
    _map.serverFiltrQuery();
}

_map.getElement = function (element) {
    
    
    
    
    
    
}

/*
 * функция ищет необходимый DOM-элемент внутри указанного DOM-элемента
 *
 * @param string element
 *      айдишник элемента, который надо найти
 * 
 * @param string inside
 *      айдишник элемента, внутри которого будем искать искомый объект
 *      
 *  @return object
 *      исокомый DOM-элемент
 *  
 **/
_map.getElementInside = function (element, inside) {
    
    var divElement = document.getElementById(inside);
    
    var elems = divElement.getElementsByTagName('*')

    for(var i=0; i<elems.length; i++) { 
        if (elems[i].id == element)
            return elems[i];
    }
    
}

/*
 * функция ищет необходимый DOM-элемент внутри указанного DOM-элемента
 *
 * @param string element
 *      айдишник элемента, который надо найти
 * 
 * @param string inside
 *      айдишник элемента, внутри которого будем искать искомый объект
 *      
 *  @return object
 *      исокомый DOM-элемент
 *  
 **/
_map.getElementInside_class = function (element, inside) {
    
    var arrToReturn = [];
    
    var divElement = document.getElementById(inside);
    
    var elems = divElement.getElementsByTagName('*')

    
    
    for(var i=0; i<elems.length; i++) {
        if (elems[i].className == element)
            arrToReturn.push(elems[i]);
    }
    
    return arrToReturn;
}

_map.handler = function(){
    
    var dataSend = {
        query : 'getDataFirm',
        essence : map.out.essence,
        idEssence : map.out.idEssence
    }
    
    
    $.post(
        W_AJAX + "controllers/controller_map.php",
        {
            dataSend : dataSend
        },
        function(serverAnswer){

            storage = serverAnswer;

            document.getElementById('filtr').innerHTML = ''; 
            document.getElementById('filtr').innerHTML = storage.message;
            eval(storage.script);
            storage.message = '';

            _map.updateMap();
        },
        'json'
     ); 
         
         

    
}